package controlador;

// <editor-fold defaultstate="collapsed" desc="imports">
import Utilidades.Errores;
import Utilidades.Fechas;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import modelo.RegistroParkingModelo;
import modelo.VehiculoModelo;
import modelo.VehiculoModeloImp;
import modelo.entidades.Entidad;
import modelo.entidades.Parking;
import modelo.entidades.ParkingImp;
import modelo.entidades.RegistroParking;
import modelo.entidades.RegistroParkingImp;
import modelo.entidades.Vehiculo;
import modelo.entidades.VehiculoImp;
import vista.Parking.ParkingVista;
import vista.RegistroParking.RegistroParkingVista;
// </editor-fold>

/**
 *
 * @author jjcamacho
 */
public class RegistroParkingControladorImp extends AbstractControladorImp<RegistroParkingModelo, RegistroParkingVista, String>
        implements RegistroParkingControlador {

    @Override
    Entidad generaEntidad(List<String> datos) {
        /* La entidad generada siempre es la misma, ya sea para crear o modificar un registro
         * aunque los datos a usar de la misma variarán. En el caso de la creación del
         * registro no se usa la fecha de salida, mientras que durante la modificación no
         * se usa la fecha de entrada, por eso no importa que sean la misma. */
        RegistroParking registro = null;
        Parking parking = new ParkingImp(datos.get(0));
        Vehiculo vehiculo = new VehiculoImp(datos.get(1));

        try {
            Date fecha = Fechas.textoAFecha(datos.get(2));
            java.sql.Timestamp fechaSQL = Fechas.obtenerTimestampSQL(fecha);
            registro = new RegistroParkingImp(vehiculo, parking, fechaSQL);
            registro.setFechaSalida(fechaSQL);
        } catch (ParseException e) {
            Errores.mostrarError(e);
        } catch (Exception ex) {
            Errores.mostrarError(ex);
        }
        return registro;
    }

    @Override
    Entidad generaEntidad(String pk) {
        Parking parking = new ParkingImp(pk);
        RegistroParking registro = new RegistroParkingImp(new VehiculoImp(null), parking, new java.sql.Timestamp(new Date().getTime()));
        return registro;
    }

    /* Ambos métodos (fireEntradaVehiculo y fireSalidaVehiculo) reciben y pasan los mismos parámetros
     * aunque cada uno llama a un método diferente del controlador, que básicamente construye la misma
     * entidad con esos datos. La diferencia está en el método del modelo que cada uno de ellos invoca.
     * Así, mientras la creación del registro usa la fecha para determinar el momento de la entrada
     * en el parking, la modificación usa la matrícula para efectuar la búsqueda del registro correspon-
     * diente y la fecha para marcar la salida (en este caso el nombre del parking no se usa). */
    @Override
    public void fireEntradaVehiculo(Parking parking, ParkingVista vista, String matricula, String fechaEntrada) {
        List<String> datos = new ArrayList<String>();
        datos.add(parking.getNombre());
        datos.add(matricula);
        datos.add(fechaEntrada);
        VehiculoModelo vehiculoModelo = new VehiculoModeloImp();
        try {
            Vehiculo vehiculo = vehiculoModelo.obtenerEntidad(matricula);
            /*Se permite el paso si no es un vehículo registrado (vehiculo==null) y el parking es público
             * o si el vehículo está registrado (vehiculo!=null) y coincide el tipo de parking con el asignado*/
            if (parking.getPlazasLibres() <= 0) {
                parking.setEstado("completo");
                vista.getController().fireDataModelChanged();
            } else if ((vehiculo == null && parking.getGrupo().toLowerCase().equals("publico")) ||
                    (vehiculo != null && parking.getGrupo().toLowerCase().equals(vehiculo.getGrupo().toLowerCase()))) {
                parking.setPlazasLibres(parking.getPlazasLibres() - 1);
                nuevaEntidadGesture(datos);
                parking.setEstado("pasar");
                vista.getModel().actualizarEntidad(parking);
            } else {
                parking.setEstado("no permitir");
                vista.getController().fireDataModelChanged();
            }
        } catch (SQLException ex) {
            Errores.mostrarError(ex);
        } catch (Exception ex) {
            Errores.mostrarError(ex);
        }
    }

    @Override
    public void fireSalidaVehiculo(Parking parking, ParkingVista vista, String matricula, String fechaSalida) {
        List<String> datos = new ArrayList<String>();
        datos.add(parking.getNombre());
        datos.add(matricula);
        datos.add(fechaSalida);

        parking.setPlazasLibres(parking.getPlazasLibres() + 1);
        actualizaEntidadGesture(datos);
        parking.setEstado("pasar");
        try {
            vista.getModel().actualizarEntidad(parking);
        } catch (SQLException ex) {
            Errores.mostrarError(ex);
        } catch (Exception ex) {
            Errores.mostrarError(ex);
        }
    }
}
